物理知识在FLASH世界中的应用
一、匀速直线运动
物理公式:x=x0+v*t;
步骤:
1.新建文件550*400像素其他的默认;
2."ctrl"+F8,创建一个影片剪辑,名称“MC”
3.回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台左端,
4.选中这个MC,绑定代码:
onClipEvent(load){//影片加载一次
v=5;
}
onClipEvent(enterFrame){//进入贞
_x+=v;
if(_x>400){
_x=0; //当MC超出舞台的位置,我们就把就要重新设置MC的起始位置
}
}
//根据公式:x=x0+v*t, "t"表示影片每次调用enterFrame事件次数,场景中的MC的_x位置都会增加一个变量V(V=5,加载时初使化的值),同理:第10次调用enterFrame事件后x=x0+v*10
二:变速运动
在变速运动中,物体的速度是随时间变化的,这个变化可以是运动快慢的变化,也可以是运动方向的变化,而“加速度”就是描述质点的速度(大小和方向)随时间变化快慢的物理量
物理公式:v=v0+a*t
其中"a"为加速度,表达式:a=dv/dt(速度差/时间);//不做详解,我们不是研究物理滴:)
1. 新建文件550*400像素其他的默认;
2. "ctrl"+F8,创建一个影片剪辑,名称“MC”
3. 回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台左端,
4. 选中这个MC,绑定代码:
onClipEvent(load){//影片加载一次
v=1;
a=3;
}
onClipEvent(enterFrame){//进入贞
v+=a; //v=v0+at
_x+=v; //x=x0+vt;
if(_x>400)
_x=0; //当MC超出舞台的位置,我们就把就要重新设置MC的起始位置
}
// 影片每次调用enterFrame事件,变量“V”不断累积的增加变量“a”,速度越来越大,所以以便剪辑“MC”的移动速度越来越高,每当“MC”超过舞台的范围时(_x>400)就会重设到最左边(_x=0);由于速度太快,时间长了剪辑“MC”就看似停下来了
三:简谐运动
简谐运动是一种变加速运动,比前面学过的各种运动复杂
定义:简谐运动指物体在相同时间间隔内在同一路程上来回移动进行的运动;
重点是,通过弹簧振子的实例,把简谐运动在一次全振动过程中的受力情况和运动情况弄清楚。
步骤:
1. 新建文件550*400像素其他的默认;
2. "ctrl"+F8,创建一个影片剪辑,名称“MC”
3. 回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台左端,
4. 选中这个MC,绑定代码:
onClipEvent(load){
r=100; //半径
rad=0;
y0=_y; //y的平衡位置
}
onClipEvent(enterFrame){
_y=y0+Math.sin(rad)*r;
rad+=50; //角度的不断变化,实现弹簧振子在固定的半径上下振动
} //这个值可以根据你需要的频率改变,试试:rad+=5
点击浏览该文件
2. 其实,上面的公式是可以推广的,因为在现实的世界,弹簧振子是需要考虑重力,空气摩擦,等很多其他方面的因素,但是,在FLASH世界中,却是能完全实现真空状态理想物理模型,这里加入了角度的计算,(见图解)
照受力分析,按“位”运算分别求出_x,_y,//不懂的看看大学物理书吧:)
简单的说:分别求出_x, _y,得到的就是倾斜方向的运动结果
把效果1的代码换成下面的试试
onClipEvent(load){
rx=50;
ry=100
rad=0;
jiaodu=1//倾斜方向,见图解
x0=_x;
y0=_y;//y的平衡位置
}
onClipEvent(enterFrame){
_x=x0+Math.sin(rad)*rx*jiao;
_y=y0+Math.sin(rad)*ry;
rad+=50; //角度的不断变化,实现弹簧振子在固定的半径上下振动
} //这个值可以根据你需要的频率改变,试试:rad+=5;
值得注意的是:以下的两种情况
四:阻尼运动
定义:
前面所讲的谐振动是一种理想状况,即谐振子系统做无阻尼(无摩擦和辐射损失)的自由振动,它是等幅振动。而在实际中,阻尼是不可消除的,如果没有能量补充,由于机械能有损耗,起振幅将不断地衰减,这种振幅随时间不断衰减的振动叫阻尼振动
代码如下:
onClipEvent(load){
r=100;
rad=0;
y0=_y;//y的平衡位置
zuli=1;
}
onClipEvent(enterFrame){
_y=y0+Math.sin(rad)*r*zuli;
zuli*=0.98;//不断减小,并且接近与0,(zuli>0)
rad+=50; //角度的不断变化,实现弹簧振子在固定的半径上下振动
} //这个值可以根据你需要的频率改变,试试:rad+=5;
//变量"zuli"初使值是1,当zuli非常接近0的时候,也就相当与弹簧振子停下来了
加入了角度的:
五:抛物运动
抛物运动是物体受外力开始运动后,没有再受到外力的作用,其水平运动和垂直运动是彼此独立的。不考虑空气阻力的影响,水平方向的运动是匀速直线运动,垂直方向的运动是自由落体运动,(如图)
下面我们试着用程序来模拟平抛运动
步骤:
1. 新建文件800*400像素其他的默认;
2. "ctrl"+F8,创建一个影片剪辑,名称“MC”
3. 回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,
4. 选中这个MC,打开对齐面版,相对于舞台---左对齐----底对齐,绑定代码:
onClipEvent(load){//MC被加载时,只运行一次
x0=_x;
y0=_y;//初使位置
v=0; //球的速度
rad=0;//球的角度,初使值为0
t=0; //运动时间
dragtime=0; //小球开始拖动的时间;
isdrag=0; //判断球是否被拖动的变量;
isout=0;//判断球是否抛出去了
g=-0.098;//地心的引力常量
}
onClipEvent(mouseDown){//当鼠标按下
if(hitTest(_root._xmouse,_root._ymouse,true)){//判断鼠标是否和小球接触
isdrag=1;//如果接触的话,就返回isdrag的值为1,目的只是用来做记号,告诉后面的程序执行相关的事件;
isout=0;
v=0;
rad=0;
this.startDrag();//开始拖动
dragtime=getTimer();//获得拖动的时间
}
}
onClipEvent(mouseUp){//松开鼠标
if(isdrag==1){
isdrag=0;
isout=1;
t=1;
rad=Math.atan2(_y-y0,_x-x0);//弧度为单位计算并返回 y/x 的反正切
v=Math.sqrt((_x-x0)*(_x-x0)+(_y-y0)*(_y-y0))/(getTimer()-dragtime);
//勾股定理,再用公式:v=s/t求出速度;
this.stopDrag();//停止拖动
}
}
onClipEvent(enterFrame){//进入贞,MC的Frame不断运行
if(isout==1){
_x+=v*Math.cos(rad)*t;
_y+=v*Math.sin(rad)*t-(g*t*t)/2;//见图解(平抛运动的公式)
t++;//t=t+1;
if(_x>800 or _y>400 ){//如果超出舞台的范围,就重设置MC的位置
isout=0;
_x=x0;
_y=y0;
}
}
}
补充:由于抛物运动把时间计算在内的,所以不能单*enterFrame时事件改变小球的位置
加入变量“t”,每次触发enterFrame事件时,代表一个单位的时间变化,我这里用的是12.0fps
补充:抛运动中的竖直上抛运动
物体以一定初速度沿竖直方向,向上抛出后,只受重力作用下的运动。
竖直上抛运动可分为两个阶段来,一个是上升过程,这时它的初速度和重力加速度g方向相反,是匀减速直线运动。上升到最高位置的时候,末速度为零,因此这个时候,物体开始作自由落体运动
这里就只补充程序几个思路吧,就不用物理公式来做了,原理是一样的
步骤:
1. 新建文件550*400像素其他的默认;
2. "ctrl"+F8,创建一个影片剪辑,名称“MC”
3. 回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,
4. 选中这个MC,绑定代码:
onClipEvent (load) {
t = 0;
a = 1;
v0 = 10;
}
onClipEvent (enterFrame) {
_y = (_y + ((a * t) - v0));//不难看出,随着(a*t)的增加,_y的值也不断增加
t++;
}
斜抛运动:
onClipEvent (load) {
t = 0;
a = 1;
v0 = 10;
}
onClipEvent (enterFrame) {
_x = (_x + v0);
_y = (_y + ((a * t) - v0));//按位运算,前面讲过了滴:)
t++;
}
平抛
onClipEvent (load) {
t = 0;
a = 1;
v0 = 10;
}
onClipEvent (enterFrame) {
_x = (_x + v0);
_y = (_y + (a * t));
t++;
}
六:自由落体运动
1. 定义:物体只在重力的作用下,从静止开始下落的运动叫自由落体运动。
2. 公式:s=1/2gt*t;
步骤
1. 新建文件550*500像素其他的默认;
2. "ctrl"+F8,创建一个影片剪辑,名称“MC”
3. 回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,
4. 选中这个MC,打开对齐面版,相对于舞台---居中对齐----上对齐,绑定代码:
onClipEvent (load) {
t=0;
g=9.8;//自由落体的加速度;
}
onClipEvent (enterFrame) {
t+=0.2;//这个值随便你设置了试试:t+=0.5
this._y=0.5*g*t*t;
if(this._y>=500){//判断是否超出场景;
this._y=0;//超出后,重设MC的位置
t=0;//重新开始后的时间是0
}
}
七:摩擦运动
新建一个MC,绑定代码:
onClipEvent(load){
_x=0;
_y=0;
speed=10;
}
onClipEvent(enterFrame){
x=_root._xmouse; //获得鼠标的x轴的位置,并且附值给变量“x”
y=_root._ymouse;
_x+=(x-_x)/speed; //把鼠标和MC的距离分成“十等份”,当(x-_x)的值不点更新时(换句话说:MC越来越接近鼠标时),就出先带摩擦的运动效果,速度逐渐下降
_y+=(y-_y)/speed;
}
其实这个不难理解,如果一时想不明白的话,就多想想就会明白的^_^
八:运动中的缓冲(实用)
当我们将这个物体从A移到B时,会产生一个加速度,并且依次产生一个速度,产生的速度会改变物体运动方向,使其回到原来位置(A)。然而,当它回到初始位置时,又没有作用力去让它停下来,因此它会继续沿BA方向朝C移动(过头了)。这时,弹簧又会产生一个加速度让物体回到它的初始位置(A),所以再没有阻碍力的情况下,物体将在其初始位置左右不停的摆动(也就是简谐运动) 弹簧反作用力是由弹性系数“k”决定的。假设在一个无摩擦的理想状态中,这根弹簧是永远的伸缩摆动下去的(也就是简谐运动),所以,,这里我们再引入一个阻碍常量“c”。就可以让它慢慢的停下来
公式:
p=k*(p1-_p)+c*p;
k*(x1-x)//胡克定理的应用
c*xp//用让小球慢满停下来的摩擦方法
步骤:
1新建文件550*400像素其他的默认;
2"ctrl"+F8,创建一个影片剪辑,名称“MC”
3回到主场景,"ctrl"+L打开库面版,把刚创建的影片剪辑拖入到舞台,
4选中这个MC,绑定代码:
onClipEvent (load){
_x = 0;
_y = 0;
k= 0.4;//摩擦系数
c =0.7;//阻碍常量
//k,c两个常量是不是固定的,你可以根据自己的需要更改它的值
}
onClipEvent (enterFrame) {
x1=_root._xmouse;//把鼠标位置附给变量x1
y1=_root._ymouse;
xp = ((x1-_x)*k)+(xp*c);
yp = ((y1-_y)*k)+(yp*c);//见上面的解释
this._x+= xp;
this._y+=yp;//this._y = this._y+yp
}
|